package com.le.tester.imooc.masterJUC.collections.concurrenthashmap;

import java.util.concurrent.ConcurrentHashMap;

/**
 * 描述：组合操作并不能保证线程的安全
 */
public class OptionsNotSafe implements Runnable {
    private static ConcurrentHashMap<String, Integer> scores = new ConcurrentHashMap<>();

    public static void main(String[] args) throws InterruptedException {
        //要加分，就要开启多个线程，不然是没有什么意义的
        scores.put("test", 0);
        //带有runTarget的线程构造器，继承了Runnable接口的类
        Thread thread1 = new Thread(new OptionsNotSafe());
        Thread thread2 = new Thread(new OptionsNotSafe());
        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();
        System.out.println(scores);
    }

    //线程执行的部分，继承了这个接口，也表明我们要开线程来执行这个run了
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            while (true) {
                //使用synchronize加锁进行操作
                //synchronized (OptionsNotSafe.class) {
                //首先进行了get
                int score = scores.get("test");
                int newScore = score + 1;
                //再来进行了put
                //组合操作了，保证不了线程安全，可以直接使用替代，来进行原子性的操作
                //scores.put("test", newScore);
                boolean replace = scores.replace("test", score, newScore);
                //System.out.println(scores.get("test"));
                //}
                if (replace) {
                    break;
                }
            }
        }
    }
}
